
/* 公共参数 */

/* 任务索引号 */
var USER_TASK = 0;
var NOTIFY_TASK = 1;
var DEVICE_TASK = 2;
var USERDATA_TASK = 3;
var GAME_TASK = 4;
var GAMEDATA_TASK = 5;
var DOCUMENT_TASK = 6;

/* 常用的宏定义 */
var NO_VIEW = 0;
var YS_VIEW = 1;
var ROOT = 0;       /* 超级用户 */
var ADMIN = 1;      /* 管理员 */
var CONSUME = 2;    /* 消费用户 */
var TYPE_LIST = 0;                  /* 列出 */
var TYPE_ADD_OR_EDIT_VIEW = 1;      /* 添加/编辑页面 */
var TYPE_ADD_OR_UPDATE = 2;         /* 添加或更新 */
var TYPE_REMOVE = 3;                /* 删除 */
var TYPE_COUNT = 4;                 /* 得到数量 */
var TYPE_GET = 5;                   /* 得到一条数据 */
var TYPE_DOWNLOAD = 6;                  /* 下载文件 */
var TYPE_STATISTICS = 7;            /* 得到统计信息 */

/* 全局变量 */
var source = $("input[name = 'source']").val();
var token = $("input[name = 'token']").val();

/* 同步通知：是否有新通知？每次新页面加载时都需要调用这个函数 */
function syncNotify() {
    console.log("---call syncNotify");
    var change = false;     /* 这次同步，有自动打开通知栏吗？ */
    var isNew = 0;
    /* 同步调用：得到是否有新通知 */
    callByAjax(null, source, 5, NO_VIEW, "", NOTIFY_TASK, false, function (result) {
        isNew = parseInt(result.data);
    }, token);

    /* 如果有新通知，同步数据并弹出通知栏显示通知 */
    if(isNew === 1){
        /* 异步更新通知到通知栏上 */
        callByAjax(null, source, TYPE_LIST, NO_VIEW, "", NOTIFY_TASK, true, syncNotifyHandler, token);
        /* 检查通知栏状态，如果是关闭状态，我们打开它 */
        if(opened === false){
            notificationChange();
            change = true;
        }
    }

    return change;
}


/* 通知栏被点击，无论如何，都需要同步并改变通知栏状态 */
function notificationClick() {
    console.log("---call notificationClick");
    // 打开通知栏时，重新加载通知信息
    if(opened === false) {
        /* 异步更新通知到通知栏上 */
        callByAjax(null, source, TYPE_LIST, NO_VIEW, "", NOTIFY_TASK, true, syncNotifyHandler, token);
    }

    /* 改变通知栏状态 */
    notificationChange();

    return false;
}


/**
 * 通知栏状态改变
 */
var opened = false;     /* 打开状态，初始化为未打开 */
function notificationChange() {
    // console.log("---call notificationChange");
    // 通知栏打开关闭动画
    var notificationBar = $('#notificationBar');
    if(notificationBar.attr('hidden') === 'hidden'){
        /* 通知栏第一次启动，处于隐藏状态，显示它 */
        notificationBar.removeAttr('hidden');
        opened = true;
    } else {
        /* 不管处于什么状态，都切换到另一个状态 */
        notificationBar.slideToggle('slow');
        if(opened == true){
            opened = false;
        } else {
            opened = true;
        }
    }
    return false;
}

/**
 * 有新通知，依旧异步获取了，我们处理它们
 */
function syncNotifyHandler(
    result
) {
    console.log("---call notificationChangeSuccessHandler");
    // console.log("ajax结果--> ");
    // console.log(result);
    // 解析通知数据
    var notificationBar = $('#notificationBar');
    var context = notificationBar.find('ul');
    var data = JSON.parse(result.data);
    console.log(result.data);

    if(data.length === 0){
        /* 如果通知数量为空，清空通知栏 */
        context.empty();
        context.append('<li class="nav-header notification-header"><h5>通知栏</h5></li>\n');
        var noMessage = '<li class="navbar-fixed-bottom notification-item"><a class="btn btn-success form-control" href="#">无通知</a></li>';
        context.append(noMessage);
    } else {
        context.empty();
        data.forEach(function (notify) {
            // 遍历数据
            // 将数据放到网页上
            var item = '<li class="nav-item notification-item"><a style="display : inline-block;" class="nav-link active" href="#">' + notify.text + '</a><a style="display : inline-block; float: right;" href="#" class="btn btn-sm btn-danger deleteBtn" onclick="return notifyRemove(' + notify.id + ')">删除</a></li>';
            context.append(item);
        });
        // 添加清除通知栏按钮
        var clearButton = '<li class="navbar-fixed-bottom notification-item"><a class="btn btn-success form-control" href="#" onclick="return notifyClear()">清空通知栏</a></li>';
        context.append(clearButton);
    }
}

/* 删除某条通知 */
function notifyRemove(id) {
    /* 发起调用给通知任务：有id则是删除一条 */
    callByAjax(null, source, TYPE_REMOVE, NO_VIEW, id + "", NOTIFY_TASK, true, syncNotifyHandler, token);
}

/* 情况通知栏 */
function notifyClear() {
    /* 发起调用给通知任务：无id则是清空 */
    callByAjax(null, source, TYPE_REMOVE, NO_VIEW, "", NOTIFY_TASK, true, syncNotifyHandler, token);
    /* 关闭通知栏 */
    notificationChange();
}

/* 注销 */
function logout() {
    $("#logout_form").submit();
    return true;
}

/* 查看某页的用户列表 */
function userManView(
    onlyRole,       /* 只查看某角色的用户 */
    current_page    /* 当前页面 */
) {
    console.log("---call userManView - " + current_page + "," + onlyRole);
    var data_jo = {};
    data_jo.ex_int = onlyRole;
    data_jo.pageBean = {};
    data_jo.pageBean.current = current_page;
    var page_size = parseInt($("input[name = 'page_size']").val());
    if(page_size == null || page_size <= 0 || page_size > 500) page_size = 10;
    data_jo.pageBean.size = page_size;
    data_jo.pageBean.dynamicHopeSize = 10;
    var data = JSON.stringify(data_jo);
    /* 发起调用 */
    call(null, source, TYPE_LIST, YS_VIEW, data, USER_TASK, token);
}

/* 设备管理页面 */
function deviceManView(
    current_page,       /* 当前页面 */
    query_bean          /* 查询条件bean */
) {
    console.log("---call userManView - " + current_page + "," + query_bean);
    var data_jo = {};
    /* 先封装分页数据 */
    data_jo.pageBean = {};
    data_jo.pageBean.current = current_page;
    var page_size = parseInt($("input[name = 'page_size']").val());
    if(page_size == null || page_size <= 0 || page_size > 500) page_size = 10;
    data_jo.pageBean.size = page_size;
    data_jo.pageBean.dynamicHopeSize = 10;
    /* 再封装查询数据 */
    data_jo.queryBean = query_bean;
    var data = JSON.stringify(data_jo);
    /* 发起调用 */
    call(null, source, TYPE_LIST, YS_VIEW, data, DEVICE_TASK, token);
}

/* 用户数据管理页面 */
function userdataManView(
    current_page,       /* 当前页面 */
    query_bean          /* 查询条件bean */
) {
    console.log("---call userdataManView - " + current_page + "," + query_bean);
    var data_jo = {};
    /* 先封装分页数据 */
    data_jo.pageBean = {};
    data_jo.pageBean.current = current_page;
    var page_size = parseInt($("input[name = 'page_size']").val());
    if(page_size == null || page_size <= 0 || page_size > 500) page_size = 10;
    data_jo.pageBean.size = page_size;
    data_jo.pageBean.dynamicHopeSize = 10;
    /* 再封装查询数据 */
    data_jo.queryBean = query_bean;
    var data = JSON.stringify(data_jo);
    /* 发起调用 */
    call(null, source, TYPE_LIST, YS_VIEW, data, USERDATA_TASK, token);
}

/* 游戏管理页面 */
function gameManView(
    current_page,       /* 当前页面 */
    query_bean          /* 查询条件bean */
) {
    console.log("---call gameManView - " + current_page + "," + query_bean);
    var data_jo = {};
    /* 先封装分页数据 */
    data_jo.pageBean = {};
    data_jo.pageBean.current = current_page;
    var page_size = parseInt($("input[name = 'page_size']").val());
    if(page_size == null || page_size <= 0 || page_size > 500) page_size = 10;
    data_jo.pageBean.size = page_size;
    data_jo.pageBean.dynamicHopeSize = 10;
    /* 再封装查询数据 */
    data_jo.queryBean = query_bean;
    var data = JSON.stringify(data_jo);
    /* 发起调用 */
    call(null, source, TYPE_LIST, YS_VIEW, data, GAME_TASK, token);
}

/* 游戏数据管理页面 */
function gamedataManView(
    current_page,       /* 当前页面 */
    query_bean          /* 查询条件bean */
) {
    console.log("---call gamedataManView - " + current_page + "," + query_bean);
    var data_jo = {};
    /* 先封装分页数据 */
    data_jo.pageBean = {};
    data_jo.pageBean.current = current_page;
    var page_size = parseInt($("input[name = 'page_size']").val());
    if (page_size == null || page_size <= 0 || page_size > 500) page_size = 10;
    data_jo.pageBean.size = page_size;
    data_jo.pageBean.dynamicHopeSize = 10;
    /* 再封装查询数据 */
    data_jo.queryBean = query_bean;
    var data = JSON.stringify(data_jo);
    /* 发起调用 */
    call(null, source, TYPE_LIST, YS_VIEW, data, GAMEDATA_TASK, token);
}

/* 文档管理 */
function docMan() {
    call(null, source, TYPE_LIST, YS_VIEW, '', DOCUMENT_TASK, token);
    return false;
}
/* 更新文档 */
function updateDocument() {
    console.log("---call updateDocment");
    var doc = $('#docContent');
    callByAjax(null, source, TYPE_ADD_OR_UPDATE, NO_VIEW, doc.val(), DOCUMENT_TASK, true, function (result) {
        console.log("---> " + result.data);
    }, token);
    return false;
}

/* 使用Post表单提交的方式发送一条消息调用服务器的功能 */
function call(
    input_file,
    source,
    type,
    need_view,
    data,
    dest,
    /* Srping Secruity需要这个值检验是否是一个合法的Post请求 */
    _csrf_token
) {
    var url = "/send/wv";
    // 首先，判断参数是否合法；data是可以为null的
    if(source != null && type != null && need_view != null && dest != null && _csrf_token != null){
        // 创建一个from表单及其子元素
        var form = $("<form></form>");
        /* 如果是不需要页面的，更改url */
        if(need_view === NO_VIEW) url = "/send/nv";
        // 设置表单属性
        form.attr("action", url);
        form.attr("method", "post");
        if(input_file != null) form.attr("enctype", "multipart/form-data");
        // 设置input
        var input_token = $("<input name='_csrf' type='hidden' />");
        input_token.attr("value", _csrf_token);

        var input_source = $("<input type='hidden' name='source' />");
        input_source.attr("value", source);

        var input_messtype = $("<input type='hidden' name='type' />");
        input_messtype.attr("value", type);

        var input_data = $("<input type='hidden' name='data' />");
        input_data.attr("value", data);

        var input_hasView = $("<input type='hidden' name='needView' />");
        input_hasView.attr("value", need_view);

        var input_dest = $("<input type='hidden' name='dest' />");
        input_dest.attr("value", dest);

        // input全都附加到表单里
        if(input_file != null) form.append(input_file);
        form.append(input_token);
        form.append(input_source);
        form.append(input_messtype);
        form.append(input_data);
        form.append(input_hasView);
        form.append(input_dest);

        // 提交表单
        form.appendTo(document.body).submit();
    }

    return false;
}

/* 使用ajax进行一次服务调用 */
function callByAjax(
    input_file,
    source,
    type,
    need_view,
    data,
    dest,
    async,          /* 同步还是异步？ */
    hander,
    /* Srping Secruity需要这个值检验是否是一个合法的Post请求 */
    _csrf_token
) {
    var url = "";
    // 首先，判断参数是否合法；data是可以为null的
    if(source != null && type != null && need_view != null && dest != null && _csrf_token != null){
        // 设置url，根据是否需要视图
        if(need_view === NO_VIEW)
            url = "/send/nv";
        if (need_view === YS_VIEW)
            url = "/send/wv";
        /* 设置请求头，放入_csrf_token */
        var headers = {};
        headers['X-CSRF-TOKEN'] = _csrf_token;
        $.ajax({
            type: "POST",
            url: url,
            headers: headers,
            async: async,
            data: {
                source: source,
                type: type,
                data: data,
                needView: need_view,
                dest: dest
            },
            //请求成功
            success : hander,
            //请求失败，包含具体的错误信息
            error : function(e){
                console.log(e.status);
                console.log(e.responseText);
            }
        });
    }
    return false;
}